package 力扣._6989_几乎唯一子数组的最大和;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Solution {
    public long maxSum(List<Integer> nums, int m, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        int sum = 0, max = 0;
        //初始化——记录前k个
        for (int i = 0; i < k; i++) {
            if (map.containsKey(nums.get(i)))
                map.put(nums.get(i), map.get(nums.get(i)) + 1);
            else
                map.put(nums.get(i), 1);
            sum += nums.get(i);
        }
        if (map.size() >= m)
            max = sum;
        //开始滑动窗口遍历
        for (int i = k; i < nums.size(); i++) {
            sum = sum + nums.get(i) - nums.get(i - k);  //更新和
            //删除i-k
            int t = map.get(nums.get(i - k));
            if (t == 1)
                map.remove(nums.get(i - k));
            else
                map.put(nums.get(i - k), map.get(nums.get(i - k)) - 1);
            //加入i
            if (map.containsKey(nums.get(i)))
                map.put(nums.get(i), map.get(nums.get(i)) + 1);
            else
                map.put(nums.get(i), 1);

            if (map.size() >= m)
                max = Math.max(sum, max);
        }
        return max;
    }
}
